function EventProcessor(waitBox)
{
	EventTarget.call(this);
	this.editMode = false;
	
	this.waitBox = waitBox;
	this.formBox = new EventForm(this.waitBox);
	this.formBox.parent = this;
	
	this.debug = true;
	this.debug_func = null;
	this.hide_actions = true;
	
	this.hover_class = "hovered";
}


EventProcessor.prototype = new EventTarget();
EventProcessor.prototype.constructor = EventProcessor;

EventProcessor.prototype.beforeEdit = function(){
    this.fire("beforeEdit");
};

EventProcessor.prototype.ajaxError = function(){
	this.fire("ajaxError")
}

EventProcessor.prototype.attach_handlers = function(box)
{
	var patch = this;

	if(box != undefined)
	{
		
		$(".event-user", box).unbind("click");
		$(".event-user", box).click(function(e){
			patch.user2event(e);
			return false;
		});
		
		$(".event-action", box).unbind("click");
		$(".event-action", box).click(function(e){
			patch.eventAction(e);
			return false;
		});
		
		$(".event-form", box).unbind("click");
		$(".event-form", box).click(function(e){
			patch.formBox.show(e);
			patch.beforeEdit(e);
			return false;
		});
		
		
		if(this.hover_class.length > 0 )
		{
			$(".ebox-outer", box).unbind("hover");
			$(".ebox_outer", box).hover(
				function(){
					$(this).addClass(patch.hover_class);
				},
				function(){
					$(this).removeClass(patch.hover_class);
				}
			);
		}
	}
	else
	{
		$(".event-user").unbind("click");
		$(".event-user").click(function(e){
			patch.user2event(e);
			return false;
		});
		
		$(".event-action").unbind("click");
		$(".event-action").click(function(e){
			patch.eventAction(e);
			return false;
		});
		
		$(".event-form").unbind("click");
		$(".event-form").click(function(e){
			patch.formBox.show(e);
			patch.beforeEdit(e);
			return false;
		});
		
		if(this.hover_class.length > 0 )
		{
			$(".ebox-outer").unbind("hover");
			$(".ebox_outer").hover(
				function(){
					$(this).addClass(patch.hover_class);
				},
				function(){
					$(this).removeClass(patch.hover_class);
				}
			);
		}
	}
}

EventProcessor.prototype.user2event = function(e)
{
	var pack = new RequestFactory();

	var target = e.target || e.srcElement;
	var s = target.name.split('-');
	pack.CreateRequest('user-event', s[0], '', '')
		.CreateSection('data', 'event_id', s[2])
		.CreateSection('data', 'user_id', user_id)
		.CreateSection('data', 'categ', s[1].toUpperCase());
	
	// alert(pack.toString());
	
	this.waitBox.show(e.pageX, e.pageY);
	this.post(pack.toString());
}

EventProcessor.prototype.eventAction = function(e)
{

	var target = e.target || e.srcElement;
	var s = target.name.split('-');
	if(s[0] == 'del')
	{
		var patch_e = e;
		var patch = this;
		dlg.html("Вы действительно хотите удалить событие?");
		dlg.dialog({
			title: "Внимание!",
			resizable: false,
			modal: true,
			buttons: {
				"Да": function() {
					$( this ).dialog( "close" );
					
					var pack = new RequestFactory();
					pack.CreateRequest(s[1], s[0], '', '')
						.CreateSection('cond', 'event_id', s[2])
						.CreateSection('data', 'event_id', s[2])
						.CreateSection('data', 'categ', s[1].toUpperCase());
					
					// alert(pack.toString());
					
					patch.waitBox.show(patch_e.pageX, patch_e.pageY);
					patch.post(pack.toString());
					$("#e_"+ s[2]).empty();
				},
				
				"Нет": function() {
					$( this ).dialog( "close" );
					return;
				}
			}
		});
	}
	else
	{
		var pack = new RequestFactory();
		pack.CreateRequest(s[1], s[0], '', '')
			.CreateSection('cond', 'event_id', s[2])
			.CreateSection('data', 'event_id', s[2])
			.CreateSection('data', 'categ', s[1].toUpperCase());
		
		// alert(pack.toString());
		
		this.waitBox.show(e.pageX, e.pageY);
		this.post(pack.toString());
		$("#e_"+ s[2]).empty();
	}
}

EventProcessor.prototype.post = function(xmlString)
{
	var patch = this;
	
	$.ajax({
		type: "POST",
		url: root_url+ "/aj.php",
		async: true,
		data: { xml: xmlString },
		dataType: "xml",
		
		error: function(XMLHttpRequest, textStatus, errorThrown){
			alert(var_dump(XMLHttpRequest));
			patch.postError(XMLHttpRequest);
		},
		
		success: function(XMLHttpRequest, textStatus, obj){
			patch.postSuccess(XMLHttpRequest);
		}
	});
}

EventProcessor.prototype.postError = function(XMLHttpRequest)
{
	// this.ajaxError(XMLHttpRequest);
	if(this.debug && this.debug_func != null) this.debug_func(XMLHttpRequest);
	if(this.wait_hide) this.wait_hide();
}

EventProcessor.prototype.postSuccess = function(XMLHttpRequest)
{
	var events = XMLHttpRequest.getElementsByTagName("event");
	for(var i = 0; i < events.length; i++)
		this.updateEventBox(events[i]);
	this.waitBox.hide();
}


EventProcessor.prototype.updateEventBox = function(ev)
{
	// ID события и автора получаем из приехавшего с сервреа пакета
	// alert(ev.attributes[0].value);
	
	// IE так не работает
	//var event_id = ev.attributes["id"].value;
	
	var event_id = ev.attributes[0].value;
	var box = null;
	var boxes = $("#e_"+ event_id);
	// Только что созданное событие, которому присвоено новое ID
	if(boxes.length == 0)
	{
		// Клонируем конейнер нового события 
		box = $("#e_0").clone().insertAfter("#labelFirst");
		// и назначаем ему новый ID
		box.attr("id", "e_"+ event_id);
	}
	else
	{
		box = boxes.get(0);
	}
	
	// вставляем полученный HTML
	$(box).html(ev.textContent);
	
	this.attach_handlers(box);
	initPopupUserMenu(box);
}

EventProcessor.prototype.share = function(act){
	if(act)
	{
		
	}
}

EventProcessor.prototype.dig = function(){
}

// --------------------------------------------------------------
// Окно редактирования
// --------------------------------------------------------------
function EventForm(waitBox)
{
	// "отвязали" форму от ее контейнера
	this.form = $("#eventForm").detach();
	
	this.event_id = 0;
	
	// контейнер, где показываются форма и событие
	this.target = null;
	// html события
	this.old_event_content = null;
	
	// ссылка EventProcessor (используется для установки HTML из AJAX)
	this.parent = null;
	this.waitBox = waitBox;
	
	this.attach_handlers();
}

EventForm.prototype.attach_handlers = function()
{
	var patch = this;
	$("#doCancel", this.form).bind("click", function(e){
		patch.cancel();
		return false;
	});
	$("#doSave", this.form).bind("click", function(e){
		patch.send(e);
		return false;
	});
	$("#doDelete", this.form).bind("click", function(e){
		patch.kill(e);
		return false;
	});
}


EventForm.prototype.show = function(e)
{
	if(this.old_event_content != null)
	{
		alert("Сначала завершите текущее редактирование события!");
		return;
	}
	
	var target = e.target || e.srcElement;
	if(target.name == null) target = target.parentNode;

	var s = target.name.split('-');
	this.event_id = s[2];

	// event_id = 0 только у нового события
	if(this.event_id == 0)
	// которое нельзя удалить
		$("#doDelete", this.form).hide();
	else
	// а существующие события удалять можно
		$("#doDelete", this.form).show();

	// контейнер, куда будем вставлять форму
	this.target = $("#e_"+ this.event_id);
	// alert(var_dump(this.target));
	// содержимое этого контейнера
	this.old_event_content = $("#e_"+ this.event_id + " > div").detach();

	this.read();

	// Вставляем форму в новый конейнер 
	this.form.appendTo(this.target);
}

EventForm.prototype.read = function()
{
	// ------------------------------------------------- ЧИТАЕМ ДАННЫЕ ИЗ HTML
	// Устанавливаем текст события
	var text = $("#einfo_"+ this.event_id, this.old_event_content).text();
	$("#noteProp", this.form).val(text);
		
	// Устанавливаем дату события
	var date = $("#edata_"+ this.event_id +" a[name='date']", this.old_event_content).text();
	date = date_uni2rus(date);
	$("#dateProp", this.form).val(date);
	
	// Устанавливаем уровень доступа к событию
	var access = $("#edata_"+ this.event_id +" a[name='access']", this.old_event_content).text();
	var sel = $("#accessProp", this.form);
	var opts = $("option", sel);
	for(var i = 0; i < opts.length; i++)
	{
		var opt = opts.eq(i);
		if(opt.val() == access)
			opt.attr("selected", "selected");
		else
			opt.removeAttr("selected");
	}
	// Устанавливаем времена дня
	var parts = $("#edata_"+ this.event_id +" a[name='parts']", this.old_event_content).text();
	for(var i = 0; i < 4; i++)
	{
		if(parts.substr(i, 1) == "Y")
			$("#time"+i, this.form).attr("checked", "checked");
		else
			$("#time"+i, this.form).removeAttr("checked");
	}
}

EventForm.prototype.cancel = function()
{
	this.old_event_content.appendTo(this.target);
	this.close();
}


EventForm.prototype.close = function()
{
	this.form = this.form.detach();
	this.old_event_content = null;
}

EventForm.prototype.kill = function()
{
	var patch = this;
	dlg.html("Вы действительно хотите удалить событие?");
	dlg.dialog({
		title: "Внимание!",
		resizable: false,
		modal: true,
		buttons: {
			"Да": function() {
				$( this ).dialog( "close" );
				patch.close();
			},
			"Нет": function() {
				$( this ).dialog( "close" );
			}
		}
	});
}

EventForm.prototype.send = function(e)
{
	var date = $("#dateProp", this.form).val();
	var text = $("#noteProp", this.form).val();
	var parts = "";
	for(var i = 0; i < 4; i++)
	{
		var n = $("#time"+i+":checked", this.form).length;
		parts += (n == 0) ? "N" : "Y";
	}
	
	if(this.validate(date, text, parts))
	{
		date = date_rus2uni(date);
		var access = $("#accessProp", this.form).val();
		
		var pack = new RequestFactory();
		var req = pack.CreateRequest('event', (this.event_id == 0) ? 'ins' : 'upd', page_type, 'event-box')
			.CreateSection('data', 'date', date)
			.CreateSection('data', 'time', parts)
			.CreateSection('data', 'access', access)
			.CreateSection('data', 'text', text)
			.CreateSection('cond', 'event_id', this.event_id);
		
			this.waitBox.show(e.pageX, e.pageY);
			
			var patch = this;
			$.ajax({
				type: "POST",
				url: root_url+ "/aj.php",
				async: true,
				data: { xml: pack.toString() },
				dataType: "xml",
				
				error: function(XMLHttpRequest, textStatus, errorThrown){
					patch.waitBox.hide();
					if(DBG)
					{
						alert(var_dump(XMLHttpRequest));
					}
				},
				
				success: function(XMLHttpRequest, status, obj)
				{
					var events = XMLHttpRequest.getElementsByTagName("event");
					var n = events.length;
					if(n > 0)
					{
						patch.close();
						
						for(var i = 0; i < n; i++)
							patch.parent.updateEventBox(events[i]);
					}
					else
					{
						patch.cancel();
						
						var ans = XMLHttpRequest.getElementsByTagName("ans");
						if(ans.length > 0)
							alert("ERROR: "+ ans[0].attributes["error"].value);
					}
					patch.waitBox.hide();
				}
			});
	}
	
	return false;
}


EventForm.prototype.validate = function(date, text, parts)
{
	if(date.search(/\d{2}\.\d{2}\.\d{4}/) == -1)
	{
		alert("Неправильно введена дата. Нужно в формате дд.мм.гггг!");
		return false;
	}
	
	if(text.length == 0)
	{
		alert("Текст события не может быть короче 10 символов!");
		return false;
	}
	
	if(parts.search(/YN+Y/) != -1)
	{
		alert("Одно событие не может появляться несколько раз в день! Можете сделать два события.");
		return false;
	}
	
	if(parts == "NNNN")
	{
		alert("Время суток события не указано!");
		return false;
	}
	
	return true;
}
